package kr.hkit.wordnote.activity;

import java.util.ArrayList;

import kr.hkit.wordnote.db.WordDBHelper;
import kr.hkit.wordnote.db.WordDTO;
import kr.hkit.wordnote.exception.DBException;
import kr.hkit.wordnote.fragment.WordFindFragment;
import kr.hkit.wordnote.fragment.WordInputFragment;
import kr.hkit.wordnote.fragment.WordListFragment;
import kr.hkit.wordnote.fragment.WordStudyFragment;
import android.app.ActionBar;
import android.app.ActionBar.Tab;
import android.app.Activity;
import android.app.Fragment;
import android.app.FragmentTransaction;
import android.content.Intent;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.widget.Toast;

import com.example.wordnote2.R;

public class MainActivity extends Activity implements WordInputFragment.OnWordChangedListener, 
							WordListFragment.OnEditButtonClickedListener{
	final static String TAG = "ActionTab";
	ActionBar actionbar;
	ArrayList<String> engList;
	ArrayList<String> korList;
	ArrayList<String> engListforStudy;
	ArrayList<String> korListforStudy;
	String wordCountInOneChapter;
	String delayTime;
	String editEngWord;
	String editKorWord;
	int ckId;
	boolean reset;
	private Fragment mFragment0;
	private Fragment mFragment1;
	private Fragment mFragment2;
	private Fragment mFragment3;
	
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.mainactiontab);
		actionbar = getActionBar();
		actionbar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
		actionbar.setHomeButtonEnabled(true);
		
		//처음 시작 할 때, 설정 데이터를 가지고 온다. 
		getSetupList();
		
		//DB로부터 engword와 korword을 받아와 arraylist에 저장하는 메소드를 실행시킨다. 
		getWordList();
		getWordListForStudyFrag();
			
		//캡션으로 사용할 텍스트를 arrayList에 저장한다. 
		ArrayList<String> arrCap = new ArrayList<>();
		arrCap.add("단어목록");
		arrCap.add("단어추가");
		arrCap.add("단어검색");
		arrCap.add("깜빡이");
		
		//각각의 탭에 캡션을 지정하고 리스너를 단다. 그리고 tab을 액션바에 추가한다.
		for(int i=0; i<4; i++){
			ActionBar.Tab tab = actionbar.newTab();
			String cap = arrCap.get(i);
			tab.setText(cap);
			tab.setTabListener(new TabListener());
			actionbar.addTab(tab);
		}
	}
	
	@Override
	protected void onSaveInstanceState(Bundle outState) {
		super.onSaveInstanceState(outState);
		outState.putInt("seltab", getActionBar().getSelectedNavigationIndex());
	}
	
	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		//액션바의 메뉴 항목을 전개한다. 
		MenuInflater inflater = getMenuInflater();
		inflater.inflate(R.menu.actionbarmenu, menu);
		
		return true;
	}
	
	//편집아이콘 클릭 시, setup 액티비티를 호출한다. 
	@Override
	public boolean onOptionsItemSelected(MenuItem item) {
		switch(item.getItemId()){
		case R.id.setup:
			Intent intent = new Intent(MainActivity.this, SetUpActivity.class);
			startActivityForResult(intent, 0);
			break;
		}
		return true;
	}
	
	//setup 액티비티에서 저장을 누르면 결과값을 반환 받는다. 
	@Override
	protected void onActivityResult(int requestCode, int resultCode, Intent data) {
		Log.d(TAG, "onActivityResult");
		super.onActivityResult(requestCode, resultCode, data);
		switch(requestCode){
		case 0:
			if(resultCode == RESULT_OK){
				getSetupList();
				getWordList();
				getWordListForStudyFrag();
				actionbar.setSelectedNavigationItem(1);
				actionbar.setSelectedNavigationItem(0);
				reset = true;
			}
		}
	}
	
	
	public void getSetupList(){
		//처음 시작 할 때, 설정 데이터를 가지고 온다. 
		SharedPreferences pref = getSharedPreferences("setup", 0);
		wordCountInOneChapter = pref.getInt("wordCout", 10)+"";
		delayTime = pref.getInt("delayTime", 2)+"";
		ckId = pref.getInt("ckId", R.id.savelast);
	}

	//DB로부터 engword, korword 데이터를 받아와 engList와 korList에 저장하는 메소드
	public void getWordList(){
		//db로부터 받은 데이터를 저장할 arraylist를 준비한다.
		engList = new ArrayList<>();
		korList = new ArrayList<>();
		ArrayList<WordDTO> arList = null;
		WordDBHelper helper = null;
			
		try {
			helper = new WordDBHelper(this);
			//select문을 사용하는 메소드를 호출하여 결과값을 저장한다. 
			arList = helper.selectWord(ckId);
		} catch (DBException e) {
			Toast.makeText(this, e.getMessage(), 0).show();
		} finally {
			helper.close();
		}
		//받아온 결과로부터 engword와 korword를 분리하여 리스트에 담는다.
		for(int i=0; i<arList.size(); i++){
			WordDTO dto = arList.get(i);
			engList.add(dto.getEng());
			korList.add(dto.getKor());
		}
	}
	
	//studyfragment용 데이터 arraylist를 따로 준비한다. 
	public void getWordListForStudyFrag(){
		engListforStudy = new ArrayList<>();
		korListforStudy = new ArrayList<>();
		ArrayList<WordDTO> arList = null;
		WordDBHelper helper = null;
			
		try {
			helper = new WordDBHelper(this);
			arList = helper.selectWord(R.id.savefirst);
		} catch (DBException e) {
			Toast.makeText(this, e.getMessage(), 0).show();
		} finally {
			helper.close();
		}
		for(int i=0; i<arList.size(); i++){
			WordDTO dto = arList.get(i);
			engListforStudy.add(dto.getEng());
			korListforStudy.add(dto.getKor());
		}
	}
		
	//db에 단어 추가나 편집, 삭제가 일어났을 때 호출되는 인터페이스 메소드
	@Override
	public void onWordChanged() {
		Log.d(TAG, "onWordAddListener");
		//DB에 단어가 추가, 갱신, 삭제 되었을 때 korword와 engword 목록을 다시 받아온다.
		getWordList();
		getWordListForStudyFrag();
		//reset = true; 
	}
		
	//리스트프래그먼트에서 '편집'을 클릭했을 때, 호출되는 인터페이스 메소드 
	@Override
	public void onEditButtonClicked(String eng, String kor) {
		Log.d(TAG, "onButtonClicked");	
		this.editEngWord = eng;
		this.editKorWord = kor;
		actionbar.setSelectedNavigationItem(1);
	}
		
		
		
	
	private class TabListener implements ActionBar.TabListener{
		public TabListener(){
			Log.d(TAG, "TabListener");
		}
		
		@Override
		public void onTabSelected(Tab tab, FragmentTransaction ft) {
			Log.d(TAG, "onTabSelected");
				
			if(tab.getPosition() == 0){
				mFragment0 = WordListFragment.newInstance(engList, korList);
				ft.add(R.id.tabparent, mFragment0);
			}else if(tab.getPosition() == 1){
				mFragment1 = WordInputFragment.newInstance(engList, editEngWord, editKorWord);
				editEngWord = null;
				editKorWord = null;
				ft.add(R.id.tabparent, mFragment1);
			}else if(tab.getPosition() == 2){
				mFragment2 = WordFindFragment.newInstance();
				ft.add(R.id.tabparent, mFragment2);
			}else if (tab.getPosition() == 3){
				getWordListForStudyFrag();
				mFragment3 = WordStudyFragment.newInstance(engListforStudy, korListforStudy, 
						wordCountInOneChapter, delayTime, reset);
				reset = false;
				ft.add(R.id.tabparent, mFragment3);
			}
		}
		
		@Override
		public void onTabUnselected(Tab tab, FragmentTransaction ft) {
			Log.d(TAG, "onTabUnselected");
			if(tab.getPosition() == 0){
				ft.remove(mFragment0);
			}else if(tab.getPosition() == 1){
				ft.remove(mFragment1);
			}else if(tab.getPosition() == 2){
				ft.remove(mFragment2);
			}else if (tab.getPosition() == 3){
				ft.remove(mFragment3);
			}
		}

		@Override
		public void onTabReselected(Tab tab, FragmentTransaction ft) {
			
		}
	}
}
